#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN=1e5+10;
int n,m,a[MAXN],map1[MAXN],cnt,root[MAXN],v;
struct point
{
	int lc,rc,sum;
}p[MAXN*20];
void build(int &o,int l,int r)
{
	o=++cnt;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(p[o].lc,l,mid);
	build(p[o].rc,mid+1,r);
	return;
}
void insert(int pre,int &o,int l,int r)
{
	o=++cnt;
	p[o].lc=p[pre].lc;
	p[o].rc=p[pre].rc;
	p[o].sum=p[pre].sum+1;
	if(l==r)return;
	int mid=(l+r)>>1;
	if(v<=mid)insert(p[pre].lc,p[o].lc,l,mid);
	else insert(p[pre].rc,p[o].rc,mid+1,r);
	return;
}

int query(int o1,int o2,int l,int r,int v)
{
	if(l==r)return l;
	int t=p[p[o2].lc].sum-p[p[o1].lc].sum,mid=(l+r)>>1;
	if(v<=t)return query(p[o1].lc,p[o2].lc,l,mid,v);
	else return query(p[o1].rc,p[o2].rc,mid+1,r,v-t);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]);
	memcpy(map1,a,sizeof(a));
	sort(map1+1,map1+1+n);
	build(root[0],1,n);
	for(int i=1;i<=n;++i)
	{
		v=lower_bound(map1+1,map1+1+n,a[i])-map1;
		insert(root[i-1],root[i],1,n);
	}
	while(m--)
	{
		int t1,t2,t3;
		scanf("%d%d%d",&t1,&t2,&t3);
		printf("%d\n",map1[query(root[t1-1],root[t2],1,n,t3)]);
	}
	return 0;
}
